1 import random, pygame, sys, time
2 from pygame.locals import *
3
4 FPS = 30
5 WINDOWWIDTH = 600
6 WINDOWHEIGHT = 600
7 BIRDSIZE = (50, 40)
8
9 BLACK = ( 0, 0, 0)
10 WHITE = (255, 255, 255)
11
12 KICHTHUOCCOT = 70
13 KICHTHUOCTRONG = 200
14 KHOANGCACHCOT = 225
15 TOCDOCOT = 5
16
17 def main():
18 global FPSCLOCK, DISPLAYSURF
19 pygame.init()
20 #pygame.display.set_caption('FLAPPY BIRD')
21 FPSCLOCK = pygame.time.Clock()
22 DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
23 a = 1.25
24 t = 0
25 bg = pygame.image.load('bg.bmp').convert()
26 while True:
27 viTriChim = [WINDOWWIDTH/2 - BIRDSIZE[0]/2, WINDOWHEIGHT/2 - BIRDSIZE[1]/2]
28 v = 0
29 tt = 0
30 vChu = 0
31 viTriChu = -100
32 while True:
33 #DISPLAYSURF.fill(WHITE)
34 DISPLAYSURF.blit(bg, (0, 0))
35 mouseClick = False
36 for event in pygame.event.get():
37 if event.type == QUIT or (event.type == KEYUP and event.key == K_ESCAPE):
38 pygame.quit()
39 sys.exit()
40 if event.type == MOUSEBUTTONUP:
41 mouseClick = True
42 if mouseClick == True:
43 break
44 viTriChim[1] = viTriChim[1] + v + a/2
45 v = v + a
46 if viTriChim[1] > WINDOWHEIGHT/2:
47 v = -10
48 veChim(viTriChim, t)
49 veChu('FLAPPY BIRD', viTriChu, 90, BLACK)
50 viTriChu += vChu + 1.25/2
51 vChu += 1.25
52 if viTriChu >= WINDOWHEIGHT/2 - 90:
53 viTriChu = WINDOWHEIGHT/2 - 90
54 vChu = 0
55 if tt <= 8:
56 veChu('Click to start', WINDOWHEIGHT*0.6, 40, BLACK)
57 else:
58 veChu('Click to start', WINDOWHEIGHT*0.6, 40, (200, 200, 200))
59 if tt >= 18:
60 tt = 0
61 else:
62 tt += 1
63 if t >= 9:
64 t = 0
65 else:
66 t = t + 1
67 pygame.display.update()
68 FPSCLOCK.tick(FPS)
69 v = -15
70 cot = [[0,0],[0,0],[0,0],[0,0],[0,0]]
71 cot[0][0] = WINDOWWIDTH
72 cot[0][1] = 100
73 diem = 0
74 ktDiem = True
75 for i in range(1, 5):
76 cot[i][0] = cot[i-1][0] + KHOANGCACHCOT
77 cot[i][1] = random.randrange(80, WINDOWHEIGHT - KICHTHUOCTRONG - 100, 5)
78
79 while True:
80 #DISPLAYSURF.fill(WHITE)
81 DISPLAYSURF.blit(bg, (0, 0))
82 if vaCham(viTriChim, cot):
83 break
84 mouseClick = False
85 for event in pygame.event.get():
86 if event.type == QUIT or (event.type == KEYUP and event.key == K_ESCAPE):
87 pygame.quit()
88 sys.exit()
89 if event.type == MOUSEBUTTONUP:
90 mouseClick = True
91 thayDoiViTriCot(cot)
92 v = thayDoiViTriChim(viTriChim, a, v, mouseClick)
93 ve5Cot(cot)
94 veChim(viTriChim, t)
95 if tangDiem(cot, ktDiem):
96 diem += 1
97 ktDiem = False
98 else:
99 ktDiem = True
100 veDiem(diem)
101
102 if t >= 9:
103 t = 0
104 else:
105 t = t + 1
106
107 pygame.display.update()
108 FPSCLOCK.tick(FPS)
109 v = 0
110 viTriChu = -100
111 vChu = 0
112 while True:
113 #DISPLAYSURF.fill(WHITE)
114 DISPLAYSURF.blit(bg, (0, 0))
115 ktThoatChim = False
116 ktThoatChu = False
117 for event in pygame.event.get():
118 if event.type == QUIT or (event.type == KEYUP and event.key == K_ESCAPE):
119 pygame.quit()
120 sys.exit()
121 ve5Cot(cot)
122 veChim(viTriChim, t)
123 veChu('GAME OVER', viTriChu, 90, BLACK)
124 viTriChu += vChu + 1.25/2
125 vChu += 1.25
126 v = thayDoiViTriChim(viTriChim, a, v, False)
127 if viTriChim[1] >= WINDOWHEIGHT - BIRDSIZE[1]:
128 viTriChim[1] = WINDOWWIDTH - BIRDSIZE[1]
129 v = 0
130 ktThoatChim = True
131 if viTriChu >= WINDOWHEIGHT/2 - 90:
132 viTriChu = WINDOWHEIGHT/2 - 90
133 vChu = 0
134 ktThoatChu = True
135 if ktThoatChim == True and ktThoatChu == True:
136 break
137 pygame.display.update()
138 FPSCLOCK.tick(FPS)
139 tt = 0
140 while True:
141 #DISPLAYSURF.fill(WHITE)
142 chuDiem = 'Score: ' + str(diem)
143 DISPLAYSURF.blit(bg, (0, 0))
144 ve5Cot(cot)
145 veChim(viTriChim, t)
146 veChu('GAME OVER', WINDOWHEIGHT/2 - 90, 90, BLACK)
147 veChu(chuDiem, WINDOWHEIGHT/2, 50, BLACK)
148 if tt <= 8:
149 veChu('Click to replay', WINDOWHEIGHT*0.6, 40, BLACK)
150 else:
151 veChu('Click to replay', WINDOWHEIGHT*0.6, 40, (200, 200, 200))
152 if tt >= 18:
153 tt = 0
154 else:
155 tt += 1
156 mouseClick = False
157 for event in pygame.event.get():
158 if event.type == QUIT or (event.type == KEYUP and event.key == K_ESCAPE):
159 pygame.quit()
160 sys.exit()
161 if event.type == MOUSEBUTTONUP:
162 mouseClick = True
163 if mouseClick == True:
164 break
165 pygame.display.update()
166 FPSCLOCK.tick(FPS)
167
168 def thayDoiViTriChim(viTri, a, v, mouseClick):
169 if mouseClick == True:
170 v = -15
171 viTri[1] = viTri[1] + v + a/2
172 v = v + a
173 return v
174
175 def veChim(viTri, t):
176 chim1 = pygame.image.load('chim1.png')
177 chim2 = pygame.image.load('chim2.png')
178 if t <= 4:
179 DISPLAYSURF.blit(chim1, viTri)
180 else:
181 DISPLAYSURF.blit(chim2, viTri)
182
183 def veCot(vitri, viTriTrong, kichThuoc, kichThuocTrong):
184 pygame.draw.rect(DISPLAYSURF, (0, 200, 0), (vitri, 0, kichThuoc, viTriTrong))
185 pygame.draw.rect(DISPLAYSURF, (0, 200, 0), (vitri, viTriTrong+kichThuocTrong, kichThuoc, WINDOWHEIGHT - kichThuocTrong - viTriTrong))
186 pygame.draw.rect(DISPLAYSURF, (0, 255, 0), (vitri + kichThuoc/4, 0, kichThuoc/4, viTriTrong))
187 pygame.draw.rect(DISPLAYSURF, (0, 255, 0), (vitri + kichThuoc/4, viTriTrong+kichThuocTrong, kichThuoc/4, WINDOWHEIGHT - kichThuocTrong - viTriTrong))
188 pygame.draw.rect(DISPLAYSURF, BLACK, (vitri, - 4, kichThuoc, viTriTrong + 4), 2)
189 pygame.draw.rect(DISPLAYSURF, BLACK, (vitri, viTriTrong+kichThuocTrong, kichThuoc, WINDOWHEIGHT - kichThuocTrong - viTriTrong + 4), 2)
190 pygame.draw.rect(DISPLAYSURF, (0, 150, 0), (vitri - 2, viTriTrong - 30, kichThuoc + 4, 30))
191 pygame.draw.rect(DISPLAYSURF, (0, 150, 0), (vitri - 2, viTriTrong + kichThuocTrong, kichThuoc + 4, 30))
192 pygame.draw.rect(DISPLAYSURF, BLACK, (vitri - 2, viTriTrong - 30, kichThuoc + 4, 30), 2)
193 pygame.draw.rect(DISPLAYSURF, BLACK, (vitri - 2, viTriTrong + kichThuocTrong, kichThuoc + 4, 30), 2)
194
195 def ve5Cot(cot):
196 for i in range(5):
197 veCot(cot[i][0], cot[i][1], KICHTHUOCCOT, KICHTHUOCTRONG)
198
199 def thayDoiViTriCot(cot):
200
201 if cot[0][0] < -KICHTHUOCCOT:
202 for i in range(4):
203 cot[i][0] = cot[i+1][0]
204 cot[i][1] = cot[i+1][1]
205
206 cot[4][0] = cot[3][0] + KHOANGCACHCOT
207 cot[4][1] = random.randrange(80, WINDOWHEIGHT - KICHTHUOCTRONG - 100, 5)
208 for i in range(5):
209 cot[i][0] -= TOCDOCOT
210
211 def Cham1Cot(viTriChim, cot):
212 GhChimTren = viTriChim[1]
213 GhChimDuoi = viTriChim[1] + BIRDSIZE[1]
214 GhChimTrai = viTriChim[0]
215 GhChimPhai = viTriChim[0] + BIRDSIZE[0]
216
217 GhCotTrai = cot[0]
218 GhCotPhai = cot[0] + KICHTHUOCCOT
219 GhCotTren = cot[1]
220 GhCotDuoi = cot[1] + KICHTHUOCTRONG
221
222 if GhChimTrai > GhCotPhai - KICHTHUOCCOT/4:
223 return False
224 if (GhChimPhai - GhCotTrai) > 0 and (GhCotTren - GhChimTren) > 0:
225 return True
226 if (GhChimDuoi - GhCotDuoi) > 0 and (GhChimPhai - GhCotTrai) > 0:
227 return True
228 if GhChimDuoi >= WINDOWHEIGHT or GhChimTren < -100:
229 return True
230 return False
231 def vaCham(viTriChim, cot):
232 for i in range(4):
233 if Cham1Cot(viTriChim, cot[i]):
234 return True
235 return False
236 def tangDiem(cot, ktDiem):
237 for i in range(4):
238 giuaCot = cot[i][0] + KICHTHUOCCOT/2
239 giuaManHinh = WINDOWWIDTH/2
240 if abs(giuaCot - giuaManHinh) <= TOCDOCOT/2 and ktDiem == True:
241 return True
242 return False
243 def veDiem(diem):
244 d = str(diem)
245 fontObj = pygame.font.SysFont('Comic Sans MS', 50)
246 textSurfaceObj = fontObj.render(d, False, BLACK)
247 textRectObj = textSurfaceObj.get_rect()
248 textRectObj.center = (WINDOWWIDTH/2, WINDOWHEIGHT/6)
249 DISPLAYSURF.blit(textSurfaceObj, textRectObj)
250
251 def veChu(text, vitri, size, color):
252 l = len(text)
253 fontObj = pygame.font.SysFont('Comic Sans MS', size)
254 textSurfaceObj = fontObj.render(text, False, color)
255 textRectObj = textSurfaceObj.get_rect()
256 textRectObj.center = (WINDOWWIDTH/2 - l/2, vitri)
257 DISPLAYSURF.blit(textSurfaceObj, textRectObj)
258
259 if __name__ == '__main__':
260 main()